#include<iostream>
#include <stdint.h>
#include<vector>
#include<array>
using namespace std;
template<class T>
T* Alloc(int n=10)
{
    cout<<"template"<<endl;
    return new T[n];
}
int *Alloc(int n=10)
{
    cout<<"no template"<<endl; 
    return new int[n];
}
template<class t>
t Swap(t t1,t t2)
{
    t tmp;
    tmp=t1;
    t1=t2;
    t2=tmp;
    return t2;
}
// int main()
// {
//     // int a=0;
//     // double b=2;
//     // //有些函数无法自动推导
//     // Swap<int>(a,b);
    
//     auto array=Alloc<int>(2); 
// }
int Add(int left, int right)
{
    cout<<"no template"<<endl;
 return left + right;
}

template<class T>
T Add(T left, T right)
{
    cout<<"template"<<endl;
 return left + right;
}

int main()
{
  Add(1, 2); 
 Add<int>(1, 2);   
}
//void Print(vector<int>&v)
//{
//    auto it =v.begin();
//    while(it!=v.end())
//    {
//        cout<<*it<<endl;
//
//    }
//    cout<<endl;
//}
// template <class Container>
template <class Container>
void Print(Container&v)
{
    //成分不明确 静态类型对象与类型 
    //typename 明确告诉编译器 这里是类型的模板实例化
    typename Container::const_iterator it=v.begin();
    //auto it=v.begin() auto为类型所以不需要加typename
    //vector<int>::const_iterator
    while(it!=v.end())
    {
        cout<<*it<<endl;
        it++;
    }
    cout<<endl;
}
//非类型模板参数
//非类型模板参数 必须为整形
template <class T,size_t N=10>
class Stack{
public:
    //void fun()
    //{
    //    N=100;
    //}
    T a[N];
    int _top;
    int capacity=N;
};
//int main()
//{
////    vector<int >v;
////    v.push_back(1);
////    v.push_back(3);
////    v.push_back(5);
////    v.push_back(3);
////    v.push_back(2);
////    Print(v);
//    Stack<int> st10;
//    cout<<st10.capacity<<endl;
//    Stack<int,20> st20;
//    cout<<st20.capacity<<endl;
//    //与普通数组没区别 区别为[]检查严格用assert
//    array<int, 10>a;   
//    a[0]=0;
//    for(auto c:a)
//    {
//        cout<<c;
//    }
//    
//}
//有现成吃现成
//函数模板刻画模板刻画
template<class T>
bool Less(T left,T right)
{
    return left<right;
}
template <typename T,typename TD>
bool Less(T *left,TD *right)
{
    return *left<*right;
}
template<class T1,class T2>
class Date{
public:
    void print()
    {
        cout<<"Date<T1,T2>"<<endl;
    }
private:
    T1 a1=0;
    T2 a2=0;
};
template<>
class Date<int,double>
{
public:
    void print()
    {
        cout<<"Date<int,double>"<<endl;
    }
private:
    int a1=0;
    double a2=0;
};
//偏特化
template<class T>
class Date<T,double>
{
public:
    void print()
    {
        cout<<"Date<int,double>"<<endl;
    }
private:
    T a1=0;
    double a2=0;
};
//int main()
//{
//   // cout<<Less(2,1);
//   // int a=0,b=2;
//   // cout<<Less<int>(&a,&b);
//   // int c=2;
//   // double d=4;
//   // cout<<Less<int,double>(&c,&d); 
//   Date<int, int>d1;
//   d1.print();
//   Date<int,double>d2;
//   d2.print();
//}